package work.mediway.mdm.biz.service.biz;

import com.baomidou.mybatisplus.extension.service.IService;

import java.util.List;
import java.util.Map;

import work.mediway.mdm.core.vo.TableVO;
import work.mediway.mdm.biz.bo.DataQualityConnectionBO;
import work.mediway.mdm.core.transport.ErrorMsgVO;
import work.mediway.mdm.biz.dto.biz.DataQualityConfigDTO;
import work.mediway.mdm.biz.dto.biz.DataQualityJobDTO;
import work.mediway.mdm.biz.dto.biz.DataQualityListDTO;
import work.mediway.mdm.biz.dto.biz.DataQualityVerifyDTO;
import work.mediway.mdm.biz.entity.biz.SsDataQualityConfig;
import work.mediway.mdm.biz.entity.biz.SsDataQualityLog;
import work.mediway.mdm.biz.vo.biz.SsDataQualityLogVO;
import work.mediway.mdm.biz.vo.biz.SsDataQualityTableVO;
import work.mediway.mdm.biz.vo.dict.DictFieldVO;

/**
 * @author zhongyj <1126834403@qq.com><br/>
 * @date 2022/7/11
 */
public interface SsDataQualityConfigService extends IService<SsDataQualityConfig> {

    /**
     * 新增数据质量配置信息
     *
     * @param dataQualityConfig DataQualityConfigDTO
     * @return ErrorMsgVO
     */
    ErrorMsgVO insertDataQualityConfig(DataQualityConfigDTO dataQualityConfig);

    /**
     * 查询数据质量配置信息
     *
     * @param dataQualityConfig SsDataQualityConfig
     * @return List<SsDataQualityConfig>
     */
    List<SsDataQualityConfig> selectDataQualityConfig(SsDataQualityConfig dataQualityConfig);

    /**
     * 查询系统schema
     *
     * @param accessSystemId String
     * @return List<Map < String, String>>
     */
    List<Map<String, String>> selectSourceSystemSchema(String accessSystemId);

    /**
     * 查询系统表信息
     *
     * @param accessSystemId String
     * @param sourceSchema   String
     * @return List<TableVO>
     */
    List<TableVO> selectSourceSystemTable(String accessSystemId, String sourceSchema);

    /**
     * 查询系统字典列名
     *
     * @param accessSystemId String
     * @param sourceSchema   String
     * @param tableCode      String
     * @return List<DictFieldVO>
     */
    List<DictFieldVO> selectSourceSystemColumn(String accessSystemId, String sourceSchema, String tableCode);

    /**
     * 查询主数据系统字典列名
     *
     * @param tableCode String
     * @return List<String>
     */
    List<String> selectMdmSystemColumn(String tableCode);

    /**
     * 获取数据库连接
     *
     * @param dataQualityVerifyDTO    DataQualityVerifyDTO
     * @param dataQualityConnectionBO DataQualityConnectionBO
     * @return SsDataQualityLog
     */
    SsDataQualityLog verifyAndGetConnection(DataQualityVerifyDTO dataQualityVerifyDTO, DataQualityConnectionBO dataQualityConnectionBO);

    /**
     * 开启数据质量全量校验
     *
     * @param dataQualityVerifyDTO DataQualityVerifyDTO
     */
    void startDataQualityMissing(DataQualityVerifyDTO dataQualityVerifyDTO);

    /**
     * 开启数据质量增量校验
     *
     * @param dataQualityVerifyDTO DataQualityVerifyDTO
     */
    void startDataQualityError(DataQualityVerifyDTO dataQualityVerifyDTO);

    /**
     * 开启数据质量校验
     *
     * @param dataQualityVerifyDTOList List<DataQualityVerifyDTO>
     * @return List<SsDataQualityLogVO>
     */
    List<SsDataQualityLogVO> startDataQuality(List<DataQualityVerifyDTO> dataQualityVerifyDTOList);

    /**
     * 查询数据质量表列表
     *
     * @param dataQualityListDTO DataQualityListDTO
     * @return List<DataQualityTableVO>
     */
    List<SsDataQualityTableVO> getDataQualityTable(DataQualityListDTO dataQualityListDTO);

    /**
     * 新增数据质量任务
     *
     * @param job SysJob
     */
//    void addDataQualityJob(SysJob job);

    /**
     * 数据质量绑定任务
     *
     * @param dataQualityJob DataQualityJobDTO
     */
    void dataQualityBindJob(DataQualityJobDTO dataQualityJob);

    /**
     * 删除数据质量配置信息
     *
     * @param configIds List<String>
     */
    void removeDataQualityConfig(List<String> configIds);
}
